﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace KylinORM.Mapper.Base
{
    /// <summary>
    /// 标记对象是否支持Linq查询
    /// </summary>
    public interface ILinqable<T> where T : new()
    {
        #region 使用当前实体查询
        /// <summary>
        /// 确定序列是否包含任何元素。
        /// </summary>
        /// <returns></returns>
        bool Any();
        /// <summary>
        /// 通过使用默认的相等比较器对值进行比较返回序列中的非重复元素。
        /// </summary>
        /// <returns></returns>
        List<T> Distinct();
        /// <summary>
        /// 返回序列中的第一个元素
        /// </summary>
        /// <returns></returns>
        T First();
        /// <summary>
        /// 返回序列中的第一个元素；如果序列中不包含任何元素，则返回默认值。
        /// </summary>
        /// <returns></returns>
        T FirstOrDefault();
        /// <summary>
        /// 返回序列中满足指定条件的唯一元素；如果有多个这样的元素存在，则会引发异常。
        /// </summary>
        /// <returns></returns>
        T Single();
        /// <summary>
        /// 返回序列中满足指定条件的唯一元素；如果这类元素不存在，则返回默认值；如果有多个元素满足该条件，此方法将引发异常。
        /// </summary>
        /// <returns></returns>
        T SingleOrDefault();
        /// <summary>
        /// 跳过序列中指定数量的元素，然后返回剩余的元素。
        /// </summary>
        /// <param name="count"></param>
        /// <returns></returns>
        List<T> Skip(int count);
        /// <summary>
        /// 从序列的开头返回指定数量的连续元素。
        /// </summary>
        /// <param name="count"></param>
        /// <returns></returns>
        List<T> Take(int count);
        /// <summary>
        /// 跳过序列中指定数量的元素，然后返回指定数量的连续元素。
        /// </summary>
        /// <param name="skip"></param>
        /// <param name="take"></param>
        /// <returns></returns>
        List<T> Fetch(int? skip, int? take);
        /// <summary>
        /// 统计实体数量
        /// </summary>
        /// <returns></returns>
        int Count();
        #endregion

        #region 使用指定实体查询
        /// <summary>
        /// 确定序列是否包含任何元素。
        /// </summary>
        /// <returns></returns>
        bool Any(T queryEntity);
        /// <summary>
        /// 通过使用默认的相等比较器对值进行比较返回序列中的非重复元素。
        /// </summary>
        /// <returns></returns>
        List<T> Distinct(T queryEntity);
        /// <summary>
        /// 返回序列中的第一个元素
        /// </summary>
        /// <returns></returns>
        T First(T queryEntity);
        /// <summary>
        /// 返回序列中的第一个元素；如果序列中不包含任何元素，则返回默认值。
        /// </summary>
        /// <returns></returns>
        T FirstOrDefault(T queryEntity);
        /// <summary>
        /// 返回序列中满足指定条件的唯一元素；如果有多个这样的元素存在，则会引发异常。
        /// </summary>
        /// <returns></returns>
        T Single(T queryEntity);
        /// <summary>
        /// 返回序列中满足指定条件的唯一元素；如果这类元素不存在，则返回默认值；如果有多个元素满足该条件，此方法将引发异常。
        /// </summary>
        /// <returns></returns>
        T SingleOrDefault(T queryEntity);
        /// <summary>
        /// 跳过序列中指定数量的元素，然后返回剩余的元素。
        /// </summary>
        /// <param name="queryEntity"></param>
        /// <param name="count"></param>
        /// <returns></returns>
        List<T> Skip(T queryEntity, int count);
        /// <summary>
        /// 从序列的开头返回指定数量的连续元素。
        /// </summary>
        /// <param name="queryEntity"></param>
        /// <param name="count"></param>
        /// <returns></returns>
        List<T> Take(T queryEntity, int count);
        /// <summary>
        /// 跳过序列中指定数量的元素，然后返回指定数量的连续元素。
        /// </summary>
        /// <param name="queryEntity"></param>
        /// <param name="skip"></param>
        /// <param name="take"></param>
        /// <returns></returns>
        List<T> Fetch(T queryEntity, int? skip, int? take);
        /// <summary>
        /// 统计实体数量
        /// </summary>
        /// <returns></returns>
        int Count(T queryEntity);
        #endregion

    }
}
